// 此文件是用来实现页面登录的权限控制
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style

import router, { asyncRouter } from '@/router'
import store from '@/store'
import getPageTitle from '@/utils/get-page-title'
//  to:要去哪个页面
//  from:从哪里来
//  next:它是一个函数。
//     如果直接放行 next()
//     如果要跳到其它页 next(其它页)
router.beforeEach(async(to, from, next) => {
  NProgress.start() // 开启进度条
  // getPageTitle  导入花裤衩封装的获取网页标题的函数实现
  document.title = getPageTitle(to.meta.title)
  const whiteList = ['/login', '/404']
  const token = store.state.user.token
  if (token) {
    // console.log('有token,登录')
    if (to.path === '/login') {
      // console.log('你已登录,不能再登录')
      next('/')
      // 如果next()指定了路径跳转页面,就不会经过router.afterEach
      // 如果next()直接放行,就会经过router.afterEach()
      NProgress.done() // 关闭进度条
    } else {
      // 触发actions中的函数,发送请求获取用户的信息
      // 判断用户信息是否已经获取了,如果已经获取就不需要再获取
      if (!store.state.user.userInfo.userId) {
        const menus = await store.dispatch('user/getUserInfo')
        console.log(menus, 'menus')
        console.log(asyncRouter, 'asyncRouter')
        const filterRoutes = asyncRouter.filter(route => {
          return menus.includes(route.children[0].name)
        })
        // console.log(filterRoutes, 'filterRoutes')
        filterRoutes.push({ path: '*', redirect: '/404', hidden: true })
        // 动态的添加用户可以访问的路由
        router.addRoutes(filterRoutes)
        // 将动态的路由存储到vuex里面
        store.commit('menus/setMenus', filterRoutes)
        // 404解决刷新出现白屏问题
        // 使用 next({ ...to, replace: true })来确保addRoutes()时动态添加的路由已经被完全加载上去
        // replace: true 保证动态路由添加完成了,才去访问对应的页面
        next({ ...to, replace: true })
      } else {
        next()
      }
    }
  } else {
    // console.log('没token')
    if (whiteList.includes(to.path)) {
      // console.log('拥有白名单,放行')
      next()
    } else {
      // console.log('没白名单,去登录页')
      next('/login')
      NProgress.done() // 关闭进度条
    }
  }
})

// 页面跳转完成会经过这个钩子函数
router.afterEach(() => {
  // console.log('页面跳转完成')
  NProgress.done() // 关闭进度条
})
